#ifndef ERATHOSTENESSIEVE_INC
#define ERATHOSTENESSIEVE_INC

#include <vector>
#include <cmath>
#include <iostream>

#include "Palindrome.h"
#include "Defines.h"

using namespace std;

#define MIN_RESIZE 5000

/*
 * =====================================================================================
 *        Class:  ErathostenesSieve
 *  Description:  Classe que representa o crivo de Eratóstenes
 * =====================================================================================
 */
class ErathostenesSieve
{

public:

    /*-----------------------------------------------------------------------------
     *  Imprime todos os números primos calculados
     *-----------------------------------------------------------------------------*/
    friend ostream& operator<<(ostream& os, ErathostenesSieve &sieve);

    /*-----------------------------------------------------------------------------
     *  Retorna verdadeiro se o número for primo
     *-----------------------------------------------------------------------------*/
    bool isPrime(uint number);

    /*-----------------------------------------------------------------------------
     *  Verifica se a soma ASCII da palavra é um número primo
     *-----------------------------------------------------------------------------*/
    bool isPrime(const string& s);

    /*-----------------------------------------------------------------------------
     *  Procura por palavras/frases primas nos palíndromos
     *-----------------------------------------------------------------------------*/
    uint checkForPrimes(Palindromes *palins);


private:

    /*-----------------------------------------------------------------------------
     *  Calcula valores primos até o valor max, incluindo-o
     *-----------------------------------------------------------------------------*/
    void calculatePrimes(uint max);

    /*-----------------------------------------------------------------------------
     *  Vetor booleano que indica se o índice i é primo ou não
     *-----------------------------------------------------------------------------*/
    vector<bool> primes;


};

#endif   /* ----- #ifndef ERATHOSTENESSIEVE_INC  ----- */
